// 定义天干和地支数组
const 天干 = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
const 地支 = [
  "子",
  "丑",
  "寅",
  "卯",
  "辰",
  "巳",
  "午",
  "未",
  "申",
  "酉",
  "戌",
  "亥",
];

// 五鼠遁速记口诀对应表：日干 -> 子时的天干索引
const 五鼠遁表 = {
  甲: 0, // 甲日 -> 甲子时
  己: 0, // 己日 -> 甲子时
  乙: 2, // 乙日 -> 丙子时
  庚: 2, // 庚日 -> 丙子时
  丙: 4, // 丙日 -> 戊子时
  辛: 4, // 辛日 -> 戊子时
  丁: 6, // 丁日 -> 庚子时
  壬: 6, // 壬日 -> 庚子时
  戊: 8, // 戊日 -> 壬子时
  癸: 8, // 癸日 -> 壬子时
};

/**
 * 根据五鼠遁规则，由日干和时辰支计算完整时辰干支
 * @param {string} 日干 - 日的天干，如"甲"、"乙"等
 * @param {string} 时支 - 时辰的地支，如"子"、"丑"等
 * @returns {string} 完整的时辰干支
 */
function wuShuDun(日干, 时支) {
  // 验证输入格式
  if (typeof 日干 !== "string" || 日干.length !== 1) {
    throw new Error('日干格式错误，应为单个字符，如"甲"');
  }

  if (typeof 时支 !== "string" || 时支.length !== 1) {
    throw new Error('时支格式错误，应为单个字符，如"子"');
  }

  // 检查日干是否有效
  if (!天干.includes(日干)) {
    throw new Error(`日干错误，必须是以下之一：${天干.join("、")}`);
  }

  // 检查时支是否有效
  if (!地支.includes(时支)) {
    throw new Error(`时支错误，必须是以下之一：${地支.join("、")}`);
  }

  // 获取子时的天干索引
  const 子时天干索引 = 五鼠遁表[日干];

  // 获取时辰支的索引（0-11，对应子到亥）
  const 时支索引 = 地支.indexOf(时支);

  // 计算时辰干的索引（每个时辰按顺序递增1，超过9则循环）
  const 时干索引 = (子时天干索引 + 时支索引) % 10;

  // 返回完整的时辰干支
  return 天干[时干索引] + 时支;
}
function 生成六十甲子() {
  const 六十甲子 = [];
  for (let i = 0; i < 60; i++) {
    const 天干索引 = i % 10;
    const 地支索引 = i % 12;
    六十甲子.push(天干[天干索引] + 地支[地支索引]);
  }
  return 六十甲子;
}

// 缓存六十甲子列表
const 六十甲子列表 = 生成六十甲子();

/**
 * 输入一个六十甲子，返回下一个六十甲子
 * @param {string} current - 当前六十甲子，如"甲子"、"乙丑"等
 * @returns {string} 下一个六十甲子
 */
function nextGanzhi(current) {
  // 验证输入
  if (typeof current !== "string" || current.length !== 2) {
    throw new Error('输入必须是有效的六十甲子（两个字符），如"甲子"');
  }

  // 提取天干和地支部分
  const 干 = current[0];
  const 支 = current[1];

  // 验证天干和地支有效性
  if (!天干.includes(干)) {
    throw new Error(`无效的天干：${干}，必须是${天干.join("、")}之一`);
  }
  if (!地支.includes(支)) {
    throw new Error(`无效的地支：${支}，必须是${地支.join("、")}之一`);
  }

  // 查找当前六十甲子在列表中的索引
  const 当前索引 = 六十甲子列表.indexOf(current);

  if (当前索引 === -1) {
    throw new Error(`"${current}"不是有效的六十甲子组合`);
  }

  // 计算下一个索引（循环处理，最后一个的下一个是第一个）
  const 下一个索引 = (当前索引 + 1) % 60;

  // 返回下一个六十甲子
  return 六十甲子列表[下一个索引];
}
export { wuShuDun,nextGanzhi };

